'''
    2021-12-07  23:42  by  CYL
    文件名：
        demo1.py
    历史：
        修改自demo0.py
    用途：
        用于整理demo0.py的内容至class形式。
    缺陷：
        1.暂时不知道常用的SQL语句有哪些，貌似缺少删除数据库条目的语句。
        2.详见SQLite3_CYL.insertData()的缺陷描述。
    后续：
        将在demo2.py中进行改进。
        之后再学习flask，然后结合STM32\WIFI\BLE\CAMERA\SENSOR、HTML\CSS\JavaScript这些弄一个服务器型的上位机，而不是以Tkinter\PyQT这种的上位机。
        还可以结合openpyxl这些和.xlsx结合起来的方式编写。
    近期：
        可以将.db中的表单以website的形式或者.xlsx的形式呈现出来，然后查看并修改。
'''
import os
import time
import sqlite3

class SQLite3_CYL():
    def __init__(self):
        self.nowWorkplacePath = 'NULL'
        self.nowTime = 'NULL'
        self.nowSqliteVer = 'NULL'
        
        self.table_Name = 'NULL'
        self.connectionObject = None
        self.cursorObject = None
#------        
    def getNowWorkplacePath(self)->str:
        '''
            2021-12-06  by  CYL
            函数用途：
                用于获取当前文件的工作路径。
            返回值：
                字符串型的文件路径名。
        '''
        self.nowWorkplacePath = os.getcwd()
        print('now Workplace Path is ',self.nowWorkplacePath)
        return self.nowWorkplacePath

    def getNowTime(self)->str:
        '''
            2021-12-06  by  CYL
            函数用途：
                用于获取当前时间。
            返回值：
                字符串型的当前时间。
        '''
        self.nowTime = time.ctime(time.time())
        print('now time is ',self.nowTime)
        return self.nowTime

    def getNowSQLiteVersion(self)->str:
        '''
            2021-12-06  by  CYL
            函数用途：
                用于获取当前SQLite的版本信息。
            返回值：
                字符串型的当前SQLite的版本信息。
        '''
        self.nowSqliteVer = sqlite3.sqlite_version
        print('now SQLite Version is ',self.nowSqliteVer)
        return self.nowSqliteVer 
#------
    def getCursor(self,databaseFileName:str)->sqlite3.Connection:
        '''
            2021-12-06  by  CYL
            函数用途：
                用于创建/连接（connect）一个.db文件，然后在该.db文件中创建一个游标对象(cursor)。
            传入参数：
                databaseFileName::所要指向的.db文件的文件名。
            返回值：
                返回一个所指向.db文件的游标对象。
        '''
        self.connectionObject = sqlite3.connect(f'{databaseFileName}')
        self.cursorObject = self.connectionObject.cursor()
        return self.cursorObject

    def createTable(self,tableName:str,dataConfigs:tuple):
        '''
            2021-12-06  by  CYL
            函数用途：
                用于在.db文件中创建一个Table。
            传入参数：
                tableName::所要创建的Table的表单名。
                dataConfigs::所要创建的Table中内部储存数据所对应的列的列名。
            返回值：
                无。
        '''
        try :
            str_dataConfigs = str(dataConfigs)
            self.cursorObject.execute(f'''CREATE TABLE {tableName} {str_dataConfigs}''')
        except sqlite3.OperationalError:
            print(f"{tableName} 已存在！")

    def insertData(self,tableName:str,dataValues:tuple):
        '''
            2021-12-06  by  CYL
            函数用途：
                用于在.db文件中的某一个Table中插入一行数据。
            传入参数：
                tableName::所要插入行的Table的表单名。
                dataValues::需要插入的行数据。
            返回值：
                无。
            缺陷：
                暂时没有对多次插入相同数据的行做处理。（即目前允许多次插入重复的数据行）
        '''
        str_dataValues = str(dataValues)
        print('str_dataValues = ',str_dataValues)
        
        self.cursorObject.execute(f'''INSERT INTO {tableName} VALUES {str_dataValues}''')

    def searchData(self,databaseFileName:str,tableName:str,dataConfig:str,targetValues:tuple):
        '''
            2021-12-06    by    CYL
            函数用途：
                用于在.db文件中按列分类来搜索数据，并全部显示。
            传入参数：
                databaseFileName::.db文件所对应的文件名。（因为查询时需要再次connect .db文件，并产生一个游标cursor）
                tableName::想要在.db文件中的哪张Table表单中搜索数据。
                dataConfig::想要在Table中的哪列上搜索数据。
                targetValues::想要搜索的数据。
            返回值：
                暂无。
        '''
        self.getCursor(databaseFileName)
        self.cursorObject.execute(f'''SELECT * FROM {tableName} WHERE {dataConfig}=?''',targetValues)
        print(self.cursorObject.fetchall())
        self.saveChanges()

    def saveChanges(self):
        '''
            2021-12-08  by  CYL
            函数用途：
                用于保存并关闭当前工作的.db文件。
        '''
        self.connectionObject.commit()
        self.connectionObject.close()


if __name__ == "__main__":
    #   一些需要传入的常用参数，以后可以改成字典形式。
    databaseName = "美食菜谱.db"
    tableName = "中华菜谱1"
    dataConfigs = ("序号","名称","价格")
    dataValues = ("1","经典肥瘦肉夹馍","11.0元")
    searchTarget = ("经典肥瘦肉夹馍",)
    #   创建/连接一个.db文件，生成一张表单，并插入一行数据，最后保存并退出。
    demo1_OBJ = SQLite3_CYL()
    demo1_OBJ.getCursor(databaseName)
    demo1_OBJ.createTable(tableName,dataConfigs)
    demo1_OBJ.insertData(tableName,dataValues)
    demo1_OBJ.saveChanges()
    #   查询.db文件中的内容。
    demo1_OBJ.searchData(databaseName,tableName,"名称",searchTarget)
